/* Nombre del Paquete: Paquete para la Gestion de coutas de los pacientes y pagos
 * Proposito: manejo de los pagos y coutas de los pacientes
 * Procedimientos contenidos:
 * Multar Paciente
 * Funciones contenidas:
 * existe paciente
 * coutas al dia del paciente
 * cantidad deudas multa paciente
 */
 CREATE OR REPLACE PACKAGE "SISTEMACADE"."manejoCoutasPaciente"
AS
  FUNCTION existePaciente
    (cedula NUMBER)
    RETURN BOOLEAN;

    FUNCTION coutasAlDia
    (cedula NUMBER)
    RETURN BOOLEAN;

    PROCEDURE multarPaciente (cedula NUMBER, fecha DATE, 
                              motivo VARCHAR,monto FLOAT);

    FUNCTION cantidadDeudasMultaPaciente (cedula NUMBER)
    RETURN NUMBER;

END;
/
CREATE OR REPLACE PACKAGE BODY "SISTEMACADE"."manejoCoutasPaciente"
AS
  FUNCTION existePaciente
    (cedula NUMBER)
    RETURN BOOLEAN IS
    cantidad NUMBER:= 0;
    BEGIN
    SELECT COUNT(p.cedulapaciente) INTO cantidad FROM PACIENTE p
    WHERE p.cedulapaciente = cedula;
    IF cantidad > 0 THEN
    RETURN TRUE;
    ELSE
    RETURN FALSE;
    END IF;
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Los datos no existen o estan corruptos');
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Ocurrio un error durante la operacion');
    END; 

    FUNCTION coutasAlDia
    (cedula NUMBER)
    RETURN BOOLEAN IS
    planPaciente NUMBER;
    retrasoPermitido NUMBER;
    fechaActual DATE:= SYSDATE;
    fechaUltimoPago DATE;
    v_nr NUMBER;
    BEGIN
    SELECT idplan INTO planPaciente FROM HISTORIAL_PLAN_PACIENTE
    WHERE cedulapaciente = cedula AND fechafin is null;
    SELECT retrasoPermitido INTO retrasoPermitido from PLAN
    WHERE idplan = planPaciente;
    SELECT max(fecha) INTO fechaUltimoPago FROM PAGO_PLAN
    WHERE cedulapaciente = cedula AND idplan = planPaciente;
    v_nr:= ceil (months_between(sysdate,fechaUltimoPago));
    IF v_nr > retrasoPermitido THEN
    RETURN FALSE;
    ELSE
    RETURN TRUE;
    END IF;
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Los datos no existen o estan corruptos ');
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Ocurrio un error durante la operacion');
    END;

    PROCEDURE multarPaciente (cedula NUMBER, fecha DATE, 
                              motivo VARCHAR,monto FLOAT) IS
    existePaciente BOOLEAN;
    noExiste EXCEPTION;
    BEGIN
    existePaciente:= "manejoCoutasPaciente".existePaciente(cedula);
    IF existePaciente = TRUE THEN
    INSERT INTO SISTEMACADE.MULTA_PACIENTE(idMulta, fecha, motivo, monto, pagada, cedulaPaciente) 
    VALUES(SEQ_IDMULTA.nextval, fecha, motivo, monto, 0, cedula);
    DBMS_OUTPUT.PUT_LINE('El paciente ' || cedula || ' ha sido multado con exito');
    ELSE
    raise noExiste;
    END IF;
    EXCEPTION 
    WHEN noExiste THEN
    DBMS_OUTPUT.PUT_LINE('El paciente ' || cedula || ' que usted intenta multar no existe');
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Los datos no existen o estan corruptos ');
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Ocurrio un error durante la operacion');
    END;

    FUNCTION cantidadDeudasMultaPaciente (cedula NUMBER)
    RETURN NUMBER IS
    noExiste EXCEPTION;
    existePaciente BOOLEAN;
    cantidadDeudasPaciente NUMBER;
    BEGIN
    existePaciente := "manejoCoutasPaciente".existePaciente(cedula);
    IF existePaciente = TRUE THEN
    select count(mp.cedulapaciente) INTO cantidadDeudasPaciente 
    FROM multa_paciente mp, paciente p
    where mp.cedulapaciente = p.cedulapaciente
    and p.cedulapaciente = cedula
    and mp.pagada = 0 ;
    RETURN cantidadDeudasPaciente;
    ELSE
    raise noExiste;
    END IF;
    EXCEPTION 
    WHEN noExiste THEN
    DBMS_OUTPUT.PUT_LINE('El paciente ' || cedula || ' que usted intenta multar no existe');
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Los datos no existen o estan corruptos ');
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Ocurrio un error durante la operacion');
    END;
END;